#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
HydroPulse-DX 主程序
水文流量数据管理系统 - TimescaleDB vs PostgreSQL 性能对比

作者: HydroPulse-DX Team
用途: 教学演示
"""

import argparse
import os
import sys

# 添加src目录到Python路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src'))

# 导入新架构的模块
from hydropulse.services.data_generator import DataGenerator
from hydropulse.services.performance_test import PerformanceTest
from hydropulse.config.settings import get_database_config
from hydropulse.database.init import initialize_database
from hydropulse.utils.logger import get_logger

# 配置日志
logger = get_logger(__name__)


def init_database_wrapper():
    """初始化数据库"""
    logger.info("🔧 正在初始化数据库...")
    try:
        initialize_database()
        logger.info("✅ 数据库初始化完成")
        return True
    except Exception as e:
        logger.error(f"❌ 数据库初始化失败: {e}")
        return False


def generate_data():
    """生成测试数据"""
    logger.info("📊 正在生成大规模测试数据...")
    try:
        # 使用更大的批次大小以提升插入性能
        generator = DataGenerator(batch_size=50000)
        generator.generate_and_insert_data()
        logger.info("✅ 大规模测试数据生成完成")
        return True
    except Exception as e:
        logger.error(f"❌ 测试数据生成失败: {e}")
        return False


def run_performance_test():
    """运行性能测试"""
    logger.info("🚀 正在运行性能测试...")
    try:
        tester = PerformanceTest()
        results = tester.run_comprehensive_test(iterations=3)

        if results:
            analysis = tester.analyze_results(results)

            if 'summary' in analysis and analysis['summary']:
                summary = analysis['summary']
                logger.info("\n" + "=" * 60)
                logger.info("📈 性能测试结果摘要")
                logger.info("=" * 60)
                logger.info(f"时序表平均执行时间: {summary['timeseries_avg']:.4f} 秒")
                logger.info(f"普通表平均执行时间: {summary['regular_avg']:.4f} 秒")
                logger.info(f"性能比率: {summary['performance_ratio']:.2f}x")
                logger.info("=" * 60)

        logger.info("✅ 性能测试完成")
        return True
    except Exception as e:
        logger.error(f"❌ 性能测试失败: {e}")
        return False


def start_streamlit():
    """启动Streamlit界面"""
    logger.info("🌐 正在启动Streamlit界面...")
    import subprocess

    # 优先使用新架构
    src_path = os.path.join(os.path.dirname(__file__), 'src')
    new_app_path = os.path.join(src_path, 'hydropulse', 'web', 'app.py')

    try:
        if os.path.exists(new_app_path):
            logger.info("使用新架构启动Web界面...")
            # 切换到src目录并启动
            subprocess.run([
                sys.executable, "-m", "streamlit", "run",
                "hydropulse/web/app.py", "--server.port", "8502"
            ], cwd=src_path, check=True)
        else:
            logger.info("使用兼容模式启动Web界面...")
            subprocess.run([sys.executable, "-m", "streamlit", "run", "streamlit_app.py"], check=True)
    except subprocess.CalledProcessError as e:
        logger.error(f"❌ Streamlit启动失败: {e}")
        return False
    except KeyboardInterrupt:
        logger.info("\n👋 Streamlit界面已关闭")
        return True


def show_system_info():
    """显示系统信息"""
    logger.info("=" * 60)
    logger.info("💧 HydroPulse-DX 系统信息")
    logger.info("=" * 60)

    try:
        db_config = get_database_config()
        logger.info(f"数据库主机: {db_config['host']}:{db_config['port']}")
        logger.info(f"数据库名称: {db_config['database']}")
        logger.info(f"用户名: {db_config['user']}")
        logger.info(f"TimescaleDB启用: {db_config.get('timescale_enabled', True)}")
    except Exception as e:
        logger.error(f"配置信息获取失败: {e}")

    logger.info("=" * 60)


def main():
    """主函数"""
    parser = argparse.ArgumentParser(
        description="HydroPulse-DX 水文流量数据管理系统",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例用法:
  python main.py --init                    # 初始化数据库
  python main.py --generate               # 生成测试数据
  python main.py --test                   # 运行性能测试
  python main.py --web                    # 启动Web界面
  python main.py --all                    # 执行完整流程
  python main.py --info                   # 显示系统信息
        """
    )

    parser.add_argument('--init', action='store_true', help='初始化数据库')
    parser.add_argument('--generate', action='store_true', help='生成测试数据')
    parser.add_argument('--test', action='store_true', help='运行性能测试')
    parser.add_argument('--web', action='store_true', help='启动Streamlit Web界面')
    parser.add_argument('--all', action='store_true', help='执行完整流程（初始化+生成数据+测试）')
    parser.add_argument('--info', action='store_true', help='显示系统信息')

    args = parser.parse_args()

    # 如果没有参数，显示帮助信息
    if not any(vars(args).values()):
        parser.print_help()
        return 0

    logger.info("💧 欢迎使用 HydroPulse-DX 水文流量数据管理系统")
    logger.info("🎯 用于演示 TimescaleDB 与 PostgreSQL 的性能差异")
    logger.info("")

    success = True

    try:
        if args.info:
            show_system_info()

        if args.all or args.init:
            success &= init_database_wrapper()
            if not success:
                return 1

        if args.all or args.generate:
            success &= generate_data()
            if not success:
                return 1

        if args.all or args.test:
            success &= run_performance_test()
            if not success:
                return 1

        if args.web:
            start_streamlit()

        if success:
            logger.info("\n🎉 所有操作完成成功！")
            if not args.web:
                logger.info("💡 提示: 使用 'python main.py --web' 启动Web界面查看结果")

    except KeyboardInterrupt:
        logger.warning("\n⚠️  操作被用户中断")
        return 1
    except Exception as e:
        logger.error(f"\n❌ 程序执行出错: {e}")
        logger.exception("程序执行异常")
        return 1

    return 0 if success else 1


if __name__ == "__main__":
    exit(main())
